package com.hanbang.chu_xing_gao_zhao.myview;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import android.content.Context;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.CheckBox;
import android.widget.LinearLayout;
import android.widget.TextView;

/**
 * checkBox 实现单选按钮的功能，并直接把选中的值返回出去，用户只需要传入组对象即可
 * 
 * 对象要求：
 * 
 * 1，容器对象是LinearLayout
 * 
 * 2,容器子对象第一个是CheckBox
 * 
 * 3，容器子对象第二个是TextView
 * 
 * 4，所需要图像由自己在适配器中设置
 * 
 * @author 阳
 * 
 */
public class Singleness implements OnClickListener {

	/** checkBox TextView map 对象 */
	private Map<CheckBox, TextView> CTMap = new HashMap<CheckBox, TextView>();

	/** checkBoxs组 实现单选 */
	private ArrayList<CheckBox> checkBoxs = new ArrayList<CheckBox>();

	/** 对话框点击事件 */
	private OnClickCallback onClickCallback = null;

	/**
	 * 初始化，把所用的按钮传递过来
	 * 
	 * @param context
	 *            上下文对象
	 * @param layouts
	 *            传一个容器数组
	 */
	public Singleness(Context context, LinearLayout... layouts) {
		// 从传递过来的容器对象把子对象取出放出集合中
		for (int i = 0; i < layouts.length; i++) {
			// 添加监听
			layouts[i].setOnClickListener(this);
			CTMap.put((CheckBox) (layouts[i].getChildAt(0)), (TextView) ((layouts[i].getChildAt(1))));
			checkBoxs.add((CheckBox) (layouts[i].getChildAt(0)));
		}

	}

	/**
	 * checkBox 选择的监听一次只能选择一个选择，是单选按钮的功能
	 * 
	 * @param v
	 *            :是一个ViewGroup对象,所以要先转换成具体对象容器，然后在从容器中获取具体的对象
	 */
	@Override
	public void onClick(View v) {

		LinearLayout ll = (LinearLayout) v;

		for (int i = 0; i < checkBoxs.size(); i++) {

			// 把点击的控件设置为选中状态
			if (checkBoxs.get(i) == (CheckBox) ll.getChildAt(0)) {
				((CheckBox) ll.getChildAt(0)).setSelected(true);

			} else {
				checkBoxs.get(i).setSelected(false);
			}
		}

		/**
		 * 实现接口并赋值
		 */
		if (onClickCallback != null) {

			onClickCallback.onClick(Singleness.this, CTMap.get((CheckBox) ll.getChildAt(0)).getText().toString());
		}
	}

	/**
	 * 接口
	 */
	public interface OnClickCallback {

		public void onClick(Singleness Singleness, String content);
	}

	/**
	 * 当设置监听时必须实现接口,通过接口参数把一些信息传递给调用者
	 * 
	 * @param callback
	 *            把接口作为参数
	 */
	public void setOnClickCallback(OnClickCallback callback) {
		onClickCallback = callback;
	}

}
